// 定义一个结构体 `ConcreteIterator`，实现了迭代器模式。
struct ConcreteIterator {
    collection: Vec<i32>, // 存储迭代的集合
    position: usize,      // 当前迭代位置
}

impl ConcreteIterator {
    // 实现结构体的构造函数 `new()`，初始化迭代器的集合和起始位置。
    fn new(collection: Vec<i32>) -> Self {
        Self {
            collection,
            position: 0,
        }
    }
}

// 实现 `Iterator` trait for `ConcreteIterator`，定义迭代器的行为和特性。
impl Iterator for ConcreteIterator {
    // 定义迭代器产出的元素类型为 `i32`。
    type Item = i32;

    // 实现 `next()` 方法，返回迭代器的下一个元素。
    // 如果还有元素未迭代，则返回 `Some` 包裹的元素值；如果已经迭代完所有元素，则返回 `None`。
    fn next(&mut self) -> Option<Self::Item> {
        if self.position < self.collection.len() {
            let result = self.collection[self.position]; // 获取当前位置的元素值
            self.position += 1; // 更新迭代器的位置索引
            Some(result) // 返回获取到的元素值
        } else {
            None // 如果已经迭代完所有元素，则返回 None
        }
    }
}

// 主函数入口 `main()`，演示迭代器模式的使用。
pub fn main() {
    let collection = vec![1, 2, 3, 4, 5]; // 创建一个包含整数的集合
    let mut iterator = ConcreteIterator::new(collection); // 创建一个 `ConcreteIterator` 迭代器

    // 使用 `while let` 循环迭代，逐个获取迭代器的元素并打印。
    while let Some(value) = iterator.next() {
        println!("{}", value); // 打印迭代器返回的元素值
    }
}
